package raf;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 提高每次读写的数据量减少实际读写的次数可以提高读写效率
 * 
 * 一次读取一组字节称为:块读取
 * 一次写出一组字节称为:块写出
 * @author 范传奇
 *
 */
public class CopyDemo2 {
	public static void main(String[] args) throws IOException {
		RandomAccessFile src = new RandomAccessFile("./movie.mkv","r");
		RandomAccessFile desc = new RandomAccessFile("./movie_cp.mkv","rw");		
		/*
		 * RandomAccessFile提供了一次读写一组字节的方法
		 * int read(byte[] data)
		 * 一次性读取给定的字节数组总长度的字节量，并将读取到的字节放入该数组中
		 * 此时返回值表示实际读取到的字节数，如果返回值为-1则表示文件末尾
		 * 注意:
		 * 这里的返回值int不再是实际读取到的字节内容，而仅表示读取到的字节数。
		 * 实际读取到的内容存在数组里了。
		 * 
		 * void write(byte[] data)
		 * 一次性将给定的字节数组中的所有字节写入文件
		 * 
		 * void write(byte[] data,int start,int len)
		 * 将给定的字节数组从下标start处的连续len个字节一次性写入文件		 * 
		 */
		/*
		 * 8位2进制      1byte
		 * 1024byte  1kb
		 * 1024kb    1mb
		 * 1024mb    1gb
		 * 1024gb	 1tb
		 */
		byte[] buf = new byte[1024*10];//10kb
		int len = 0;//记录每次读取到的字节数
		long start = System.currentTimeMillis();
		while((len = src.read(buf)) != -1) {
			desc.write(buf,0,len);
		}
		long end = System.currentTimeMillis();
		System.out.println("复制完毕，耗时："+(end-start)+"ms");
		
		src.close();
		desc.close();
	}
}








